// link:https://gitee.com/xiwenx/uvm_learning/blob/master/UVM_demo/2.5.2/my_case0.sv
`ifndef MY_CASE0__SV
`define MY_CASE0__SV
class case0_sequence extends uvm_sequence #(my_transaction);
   my_transaction m_trans;

   function  new(string name= "case0_sequence");
      super.new(name);
   endfunction 
   
   virtual task body();                           // 是uvm_sequence的核心，用于定义序列的行为。
      if(starting_phase != null)                  // 仿真的开始
         starting_phase.raise_objection(this);
      repeat (10) begin
         `uvm_do(m_trans)                         // 调用uvm_do宏，它会执行m_trans对象的do方法
      end
      #100;
      if(starting_phase != null)                  // 仿真的结束
         starting_phase.drop_objection(this);
   endtask

   `uvm_object_utils(case0_sequence)              // 调用uvm_object_utils宏，相当于在case0_sequence类中定义了一些方法，使得该类具有uvm_object类的功能
endclass


class my_case0 extends base_test;

   function new(string name = "my_case0", uvm_component parent = null);
      super.new(name,parent);
   endfunction 
   extern virtual function void build_phase(uvm_phase phase);  // 定义虚拟函数build_phase，其实现在外部
   `uvm_component_utils(my_case0)                              // 调用uvm_component_utils宏，相当于在my_case0类中定义了一些方法，使得该类具有uvm_component类的功能
endclass


function void my_case0::build_phase(uvm_phase phase);
   super.build_phase(phase);

   // uvm_config_db#(uvm_object_wrapper) 一个用于存储和检索配置信息的类，该类参数是uvm_object_wrapper，表示配置项的类型
   // set 是 uvm_config_db类的一个静态方法，用于在数据库中设置一个配置项
   uvm_config_db#(uvm_object_wrapper)::set(this,                             // 指的是调用 set 方法的 my_case0 测试类的实例
                                           "env.i_agt.sqr.main_phase",       // 指定了配置项将要被设置的位置
                                           "default_sequence",               // 配置项的名称——配合前两个，可以定位配置项的具体位置
                                           case0_sequence::type_id::get());  // 设置的这个配置项的值 —— type_id::get()这个方法可以返回类实列的唯一ID
endfunction

`endif
